//////////////////////////////////////////////////////////////////////////

#ifndef _CLIENTCONNECTION_H_
#define _CLIENTCONNECTION_H_

//////////////////////////////////////////////////////////////////////////

#ifndef _ICLIENTCONNECTION_H_
#include "iclientconnection.h"
#endif

#ifndef _CONNECTION_H_
#include "connection.h"
#endif

//////////////////////////////////////////////////////////////////////////


/** Connection implementation for client
*
*
*  @author   Pasechnik Roman
*  @author   Anastasia Karpinska
*  @since    Jun 30th, 2009
*  @updated  Jan 18th, 2010
*/
class ClientConnection : public IClientConnection,
                         public Connection
{
//////////////////////////////////////////////////////////////////////////

public:

//////////////////////////////////////////////////////////////////////////


    /** Constructor */
    ClientConnection();


    /** Destructor */
    virtual ~ClientConnection();


//////////////////////////////////////////////////////////////////////////


    /** Connects to server */
    virtual void Connect( const char* _address, int _port );


    /** Sends UDP */
    virtual void SendUDP( const NetworkPacket& _data );


//////////////////////////////////////////////////////////////////////////


    /** Setups UDP with ID */
    virtual void SetupUDP( int _clientID );


//////////////////////////////////////////////////////////////////////////

private:

//////////////////////////////////////////////////////////////////////////


    /** Establish TCP connection*/
    void EstablishTCP( const char* _address, int _port );


    /** Establish UDP connection*/
    void EstablishUDP( const char* _address, int _port );


    /** Start receive UDP */
    void StartReceiveUDP();


    /** Handle received UDP packet */
    void HandleRecvUDP( const boost::system::error_code& _error, size_t _bytesTransferred );


//////////////////////////////////////////////////////////////////////////


    /** UDP connection endpoints */
    boost::asio::ip::udp::endpoint m_UDPEndpoint;


    /** UDP socket */
    boost::asio::ip::udp::socket m_UDPSocket;


    /** Buffer for received UDP data */
    char m_RecvBufferUDP[MAX_BUFFER_SIZE];


    /** Client ID, received from server */
    int m_ID;


    /** Port number in string */
    std::string m_PortStr;


//////////////////////////////////////////////////////////////////////////
};

//////////////////////////////////////////////////////////////////////////

#endif

//////////////////////////////////////////////////////////////////////////
